#!/usr/bin/env node

/**
 * 自动生成更新日志脚本（极简版）
 * 基于 Git 提交记录生成 CHANGELOG，新版本在前
 */

import { execSync } from 'child_process'
import { existsSync, readFileSync, writeFileSync } from 'fs'
import { dirname, join } from 'path'
import { fileURLToPath } from 'url'

// 获取项目根目录
const __dirname = dirname(fileURLToPath(import.meta.url))
const rootDir = join(__dirname, '..')

const log = {
  success: (msg) => console.log(`\x1b[32m${msg}\x1b[0m`),
  error: (msg) => console.log(`\x1b[31m${msg}\x1b[0m`)
}

function exec(command) {
  try {
    return execSync(command, { encoding: 'utf8', stdio: 'pipe' })
  } catch {
    return ''
  }
}

// 生成更新日志
function generate() {
  // 检查 Git
  if (!exec('git rev-parse --git-dir')) {
    log.error('❌ 未检测到 Git 仓库')
    process.exit(1)
  }

  // 获取版本和日期
  const pkgPath = join(rootDir, 'package.json')
  const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'))
  const version = pkg.version || '0.0.1'
  const date = new Date().toISOString().split('T')[0]

  // 获取上一个版本标签
  const lastTag = exec('git describe --tags --abbrev=0 2>/dev/null').trim()

  // 获取提交记录（从上次标签到现在，如果没有标签则获取最近5条）
  let commits = []
  if (lastTag) {
    commits = exec(`git log ${lastTag}..HEAD --pretty=format:"%s"`)
      .trim()
      .split('\n')
      .filter((c) => c && c.length > 5)
  } else {
    commits = exec('git log --pretty=format:"%s" -10')
      .trim()
      .split('\n')
      .filter((c) => c && c.length > 5)
      .slice(0, 5)
  }

  // 构建新版本内容
  const newVersion = `## [${version}] - ${date}
 
 ${commits.map((c) => `- ${c}`).join('\n')}
 `

  // 读取旧内容（去掉标题）
  let oldContent = ''
  const changelogPath = join(rootDir, 'CHANGELOG.md')
  if (existsSync(changelogPath)) {
    const content = readFileSync(changelogPath, 'utf8')
    // 移除标题和当前版本
    oldContent = content
      .replace(/^# 更新日志[\s\S]*?(?=##|$)/, '')
      .replace(new RegExp(`## \\[${version}\\][\\s\\S]*?(?=##|$)`, 'g'), '')
      .trim()
  }

  // 组合内容（新版本在前）
  const fullContent = `# 更新日志
 
 ${newVersion}
 ${oldContent ? '\n' + oldContent : ''}
 
 ---
 
 本项目遵循 [语义化版本](https://semver.org/lang/zh-CN/) 规范。
 `

  // 写入文件
  writeFileSync(changelogPath, fullContent, 'utf8')
  log.success('✅ 更新日志已生成')
}

generate()
